// 封装 购物车模块
import { defineStore } from 'pinia'
import { computed, ref } from 'vue'
import { useUserStore } from './userStore'
import { getCartList, insertCart, deleteCart } from '@/api/cart'
export const useCartStore = defineStore('cart', () => {
  const userStore = useUserStore()
  // 拿到 token 判断是否登录
  const isLogin = computed(() => userStore.userInfo.token);

  // 将 获取购物车列表接口 和 接口购物车覆盖本地的购物车列表 封装成一个函数方便后续使用
  const updateNewList = async () => {
    const res = await getCartList()
    cartList.value = res.result;
  }


  // 1. 定义 state 购物车列表
  const cartList = ref([])
  // 2.定义 action 操作state的方法 加入购物车
  const addToCart = async (goods) => {
    if (isLogin.value) {
      const { skuId, count } = goods
      // 登录之后的加入购物车逻辑
      // 1.调用加入购物车接口
      await insertCart({ skuId, count })
      // // 2.调用获取购物车列表接口
      // const res = await getCartList()
      // // 3.用接口购物车覆盖本地的购物车列表
      // cartList.value = res.result;
      updateNewList()

    }
    // 未登录的加入购物车逻辑(本地逻辑)
    else {
      // 添加购物车的逻辑
      // 添加过的商品 数量+1 我们传入的对象与 我们定义的 cartList 中的对象进行对比
      // 存在则数量+1 不存在则添加到购物车
      // 没有添加过的商品 pus到购物车
      const item = cartList.value.find((item) => goods.skuId === item.skuId);
      item ? item.count++ : cartList.value.push(goods);
    }

  }

  // 3. 删除 购物车
  const delCart = async (skuId) => {
    // 登录之后的加入购物车逻辑
    if (isLogin.value) {
      // 1.调用删除购物车接口
      await deleteCart([skuId])
      // // 2.调用获取购物车列表接口
      // const res = await getCartList()
      // // 3.用接口购物车覆盖本地的购物车列表
      // cartList.value = res.result;
      updateNewList()
    }
    // 未登录的删除购物车逻辑(本地逻辑)
    else {
      // 1. 找到要删除的项
      // 2. 调用 splice 方法删除
      const index = cartList.value.findIndex((item) => skuId === item.skuId);
      cartList.value.splice(index, 1);

    }

  }



  // 4.单选功能
  const singleCheck = (skuId, selected) => {
    // 告诉这个函数 要修改谁的状态 skuId
    const item = cartList.value.find((item) => item.skuId === skuId);
    // 还要告诉这个函数 当前状态是什么
    item.selected = selected;
  }
  // 全选功能
  const allCheck = (selected) => {
    // 遍历cartList的每一项 将selected都设置为传入的状态
    cartList.value.forEach((item) => item.selected = selected);
  }

  // 清除购物车
  const clearCart = () => {
    cartList.value = []
  }

  // 计算属性 计算购物车模块
  // (1) 总的数量 所有项的count之和
  const allCount = computed(() => cartList.value.reduce((sum, item) => sum + item.count, 0))
  // (2) 总价 所有项的 count*price之和
  const allPrice = computed(() => cartList.value.reduce((sum, item) => sum + item.count * item.price, 0))
  // 计算属性 2 列表购物车 是否全选
  const isAll = computed(() => cartList.value.every((item) => item.selected))
  // 计算属性 3 列表购物车 已选择数量 注意 这里是已选中 我们需要先过滤掉未选中的 然后求和
  const selectedCount = computed(() => cartList.value.filter(item => item.selected).reduce((sum, item) => sum + item.count, 0));

  // 计算属性 4 列表购物车 已选择商品价钱
  const selectedPrice = computed(() => cartList.value.filter(item => item.selected).reduce((sum, item) => sum + item.count * item.price, 0));




  return {
    cartList,
    addToCart,
    delCart,
    singleCheck,
    allCount,
    allPrice,
    isAll,
    allCheck,
    selectedCount,
    selectedPrice,
    clearCart,
    updateNewList
  }
}, {
  persist: true
})
